
import allure
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait

from tools.get_log import GetLog

logger = GetLog.get_logger()


class Base:

    # 初始化
    def __init__(self, driver):
        """
        解决driver问题
        """
        logger.info('正在初始化driver: {}'.format(driver))
        self.driver = driver

    # 查找元素封装
    def base_find(self, loc, timeout=10, poll=0.5):
        """
        :param loc: 格式为列表或者元祖，内容：元素定位信息使用By类
        :param timeout: 查找元素超时时间，默认30秒
        :param poll: 查找元素频率，默认0.5
        :return: 元素
        """
        logger.info('正在查找元素 {}'.format(loc))
        return (WebDriverWait(self.driver,
                              timeout=timeout,
                              poll_frequency=poll)).until(lambda x: x.find_element(*loc))

    # 输入方法封装
    def base_input(self, loc, value):
        # 1.获取元素
        element = self.base_find(loc)
        # 2.清空操作
        element.clear()
        # 3.输入操作
        logger.info('正在对：{} 元素执行输入: {} 操作!'.format(loc, value))
        element.send_keys(value)

    # 点击方法封装
    def base_click(self, loc):
        self.base_find(loc).click()

    # 弹框元素悬停
    def base_element_hover(self, loc):
        # 1.获取元素
        mouse_element = self.base_find(loc)
        ActionChains(self.driver).move_to_element(mouse_element).perform()
        return self.base_find(loc).text()

    # 获取元素文本封装
    def base_get_text(self, loc):
        logger.info('正在对：{} 元素获取文本操作，获取的文本值:{}'.format(loc, self.base_find(loc).text))
        return self.base_find(loc).text

    # 截图
    def base_get_image(self):
        logger.error('断言出错，正在进行截图操作!')
        # 1.调用截图方法
        self.driver.get_screenshot_as_file('./image/err.png')
        logger.error('断言出错，正在进行截图写入allure报告!')
        self.__base_write_img()

    # 切换iframe
    def base_switch_iframe(self, iframe):
        logger.info('正在切换到: {}'.format(iframe))
        self.driver.switch_to.frame(iframe)

    # 切换到默认iframe
    def base_switch_default_iframe(self):
        logger.info('正在切换到默认iframe')
        self.driver.switch_to.default_content()

    # 刷新
    def base_refresh(self):
        logger.info('正在调用刷新方法')
        self.driver.refresh()

    # 将图片写入报告 （私有）
    def __base_write_img(self):
        # 1.获取图片文件流
        with open('./image/err.png', 'rb') as f:
            # 2.调用allure 附加方法
            file = f.read()
            allure.attach(file, '错误原因', allure.attachment_type.PNG)
            # allure.attach('错误原因：', f.read(), allure.attachment_type.PNG)
